#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <cstring>
#include <string>

using namespace std;

// 场景：简单的文件处理工具
// 父进程：用户交互界面，提供选项
// 子进程：执行具体的文件操作命令

int main() {
    cout << "=== 简单文件处理工具 ===" << endl;
    cout << "1. 列出当前目录文件" << endl;
    cout << "2. 查看文件内容" << endl;
    cout << "3. 创建新目录" << endl;
    cout << "请选择操作 (1-3): ";
    
    int choice;
    cin >> choice;
    
    // 创建子进程
    pid_t pid = fork();
    
    if (pid < 0) {
        // fork失败
        cerr << "错误: 创建子进程失败!" << endl;
        return 1;
    }
    else if (pid == 0) {
        // 子进程代码
        cout << "子进程ID: " << getpid() << " 开始执行..." << endl;
        
        switch(choice) {
            case 1:
                // 使用execl执行ls命令
                cout << "执行: ls -l" << endl;
                execl("/bin/ls", "ls", "-l", NULL);
                break;
                
            case 2: {
                // 使用execvp执行cat命令
                cout << "请输入要查看的文件名: ";
                string filename;
                cin >> filename;
                
                char* args[] = {(char*)"cat", (char*)filename.c_str(), NULL};
                cout << "执行: cat " << filename << endl;
                execvp("/bin/cat", args);
                break;
            }
                
            case 3: {
                // 使用execle执行mkdir命令
                cout << "请输入要创建的目录名: ";
                string dirname;
                cin >> dirname;
                
                char* env[] = {(char*)"PATH=/bin:/usr/bin", NULL};
                cout << "执行: mkdir " << dirname << endl;
                execle("/bin/mkdir", "mkdir", dirname.c_str(), NULL, env);
                break;
            }
                
            default:
                cerr << "无效的选择!" << endl;
                return 1;
        }
        
        // 如果exec执行成功，下面的代码不会执行
        // 如果执行到这里，说明exec调用失败
        cerr << "错误: 执行命令失败!" << endl;
        return 1;
    }
    else {
        // 父进程代码
        cout << "父进程ID: " << getpid() << " 创建了子进程: " << pid << endl;
        cout << "父进程等待子进程完成..." << endl;
        
        int status;
        waitpid(pid, &status, 0);  // 等待子进程结束
        
        if (WIFEXITED(status)) {
            cout << "子进程正常退出，退出状态: " << WEXITSTATUS(status) << endl;
        }
        else if (WIFSIGNALED(status)) {
            cout << "子进程被信号终止，信号: " << WTERMSIG(status) << endl;
        }
        
        cout << "父进程继续执行其他任务..." << endl;
        cout << "程序执行完毕!" << endl;
    }
    
    return 0;
}